package org.linuxsogood.boot.misc;

/**
 * 单例模式 使用枚举来保证安全性
 * 枚举的构造函数只会被初始化一次
 * @author honway.liu
 * @date 2019-03-06 22:16
 * @email gm100861@gmail.com
 * @blog http://linuxsogood.org
 */
public class SingletonTest {

    private SingletonTest() {
    }

    public SingletonTest getInstance() {
        return Singleton.INSTANCE.getInstance();
    }

    enum Singleton{
        /**
         * 定义枚举对象
         */
        INSTANCE;

        private SingletonTest singleton;

        /**
         * 枚举的构造,必须是私有的.
         * 有几个枚举对象,构造方法就会被调用几次
         * 因为当前枚举类只有一个枚举对象,所以该构造方法,肯定就只会初始化一次.
         * 枚举对象,是单例的,这是由JVM来保证完成的.
         */
        private Singleton(){
            singleton = new SingletonTest();
        }

        private SingletonTest getInstance() {
            return singleton;
        }

    }


    public static void main(String[] args) {
        SingletonTest singletonTest = new SingletonTest();
        SingletonTest instance1 = singletonTest.getInstance();
        SingletonTest instance2 = singletonTest.getInstance();
        System.out.println(instance1);
        System.out.println(instance2);
    }
}
